#include <openssl/aes.h>
#include <openssl/rand.h>
#include <string.h>
#include <stdio.h>

// AES-128 加密示例
void aes_encrypt(const unsigned char *plaintext, size_t plaintext_len,
                 const unsigned char *key, const unsigned char *iv,
                 unsigned char *ciphertext) {
    AES_KEY aes_key;
    // 设置加密用的AES密钥
    AES_set_encrypt_key(key, 128, &aes_key);
    // 执行AES加密
    AES_cbc_encrypt(plaintext, ciphertext, plaintext_len, &aes_key, iv, AES_ENCRYPT);
}

int main() {
    // 定义要加密的明文
    unsigned char plaintext[] = "This is a top secret.";
    // 定义输出的密文缓冲区，确保足够大以存储密文
    unsigned char ciphertext[128];
    // 定义16字节的密钥（对于AES-128）
    unsigned char key[] = "0123456789abcdef";
    // 初始化向量（IV），对于CBC模式必须是随机的或唯一的
    unsigned char iv[AES_BLOCK_SIZE];
    // 使用OpenSSL库生成随机数填充IV
    if (!RAND_bytes(iv, AES_BLOCK_SIZE)) {
        printf("Error generating random IV\n");
        return 1;
    }

    // 打印原始数据
    printf("Original: %s\n", plaintext);

    // 调用加密函数
    aes_encrypt(plaintext, strlen((char *)plaintext), key, iv, ciphertext);

    // 打印加密后的数据（十六进制表示）
    printf("Encrypted: ");
    for (int i = 0; i < sizeof(ciphertext); i++) {
        printf("%02x", ciphertext[i]);
    }
    printf("\n");

    return 0;
}
